#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>

int main()
{
	const int max=20;
	key_t llave;
	int shmid;
	int * bufescritura;
	int i=1;
	llave=ftok("/bin/ls",'c');
	if (llave<0)
	{
		perror("Error al crear la llave");
		exit(EXIT_FAILURE);
	}
	else
	{
		shmid=shmget(llave,20*sizeof(int),0600);
		printf("El valor de la llave es %d \n",llave);
		printf("El valor de id de memoria compartida es %d \n",shmid);
		if (shmid<0)
		{
			perror("Error al obtener el id de la zona de memoria compartida");
			exit(EXIT_FAILURE);
		}
		else
		{
			bufescritura=(int *) shmat(shmid,NULL,0);
			if (bufescritura<0)
			{
				perror("Error al obtener la dirección del segmento");
				exit(EXIT_FAILURE);
			}
			else
			{
				for (i=1;i<=max;i++)
				{
					printf("He leido %d de memoria\n",i,bufescritura[i-1]);
				}
				if (shmdt(bufescritura)<0)
				{
					perror("Error al desacoplar el segmento de memoria");
					exit(EXIT_FAILURE);
				}
				else
				{
					if (shmctl(shmid, IPC_RMID,0)<0)
					{
						perror("Error al borrar el segmento de la memoria");
						exit(EXIT_FAILURE);
					}
					else
					{
						printf("Se ha borrado el segmento de memoria %d \n",shmid);
						exit(EXIT_SUCCESS);
					}
				}
			}
		}
	}
}
